package com.arron.algorithm.leetcodetop100;

/**
 * Leetcode 461. 汉明距离
 */
public class HammingDistance {

    public static void main(String[] args) {

    }

    /**
     * 使用 原生api统计位中1的个数
     * @param x
     * @param y
     * @return
     */
    public int hammingDistance(int x, int y) {
        //统计位中1的个数
        return Integer.bitCount(x^y);
    }


    /**
     *  循环一步一步右移，直到s == 0
     *  缺点：要是1和0之间隔了很长，就在做无效循环
     * @param x
     * @param y
     * @return
     */
    public int hammingDistanc2(int x, int y) {
        int s = x^y;
        int count  = 0;
        while (s!=0){
            count  = count+(s&1);
           s >>=1;
        }
        return count;
    }

    /**
     *  使用 Brian Kernighan算法 直接去掉位中最右边的1
     * @param x
     * @param y
     * @return
     */
    public int hammingDistanc3(int x, int y) {
        int s = x^y;
        int count  = 0;
        while (s !=0){
            s = s&(s-1);
            count++;
        }
        return count;
    }



}
